package com.common.zrd.mapper.base;

import org.apache.ibatis.session.RowBounds;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * @author: zrd
 * @Date: 2020/4/15 09:32
 * @Description:
 */
public interface IBaseService<T> {

    /**
     * 全属性插入
     *
     * @param t
     * @return
     */
    int insert(T t);

    /**
     * 描述： 批量插入
     * 备注：
     * 日期： 10:54 2020/11/20
     * 作者： zrd
     *
     * @param t
     * @return int
     **/
    int insertList(List<T> t);

    /**
     * 描述： 批量更新
     * 备注：
     * 日期： 11:27 2020/11/20
     * 作者： zrd
     *
     * @param t
     * @return int
     **/
    int updateList(List<T> t);

    /**
     * 按给定属性插入,效率比较高
     *
     * @param t
     * @return
     */
    int insertSelective(T t);


    /**
     * 查询
     *
     * @param t
     * @return
     */
    List<T> select(T t);

    /**
     * 描述： 带排序注解的查询
     * 备注：
     * 日期： 14:49 2020/4/30
     * 作者： zrd
     *
     * @param t
     * @return java.util.List<T>
     **/
    List<T> seletCommonList(T t);

    /**
     * 查询一个
     *
     * @param t
     * @return
     */
    T selectOne(T t);

    /**
     * 获取全部数据，通常和分页一起用
     *
     * @return
     */
    List<T> selectAll();

    /**
     * 查询符合条件的数据总条数
     *
     * @param t
     * @return
     */
    int selectCount(T t);

    /**
     * 根据模板查询条数
     *
     * @param example
     * @return
     */
    int selectCountByExample(Example example);

    /**
     * 根据主键查询
     *
     * @param t
     * @return
     */
    T selectByPrimaryKey(Object t);

    /**
     * 根据模板查询
     *
     * @param example
     * @return
     */
    List<T> selectByExample(Example example);

    /**
     * 根据模板查询数据
     *
     * @param example
     * @return
     */
    T selectOneByExample(Example example);

    /**
     * 根据行号查询
     *
     * @param t
     * @param rowBounds
     * @return
     */
    List<T> selectByRowBounds(T t, RowBounds rowBounds);

    /**
     * 根据模板和行号查询
     *
     * @param example
     * @param rowBounds
     * @return
     */
    List<T> selectByExampleAndRowBounds(Example example, RowBounds rowBounds);

    /**
     * 根据模板删除
     *
     * @param example
     * @return
     */
    int deleteByExample(Example example);

    /**
     * 描述： 批量删除
     * 备注：
     * 日期： 14:24 2020/4/30
     * 作者： zrd
     *
     * @param ids id的数组
     * @return
     **/
    int deleteByIds(Long[] ids);

    /**
     * 根据主键删除
     *
     * @param t
     * @return
     */
    int deleteByPrimaryKey(T t);

    /**
     * 删除
     *
     * @param t
     * @return
     */
    int delete(T t);

    /**
     * 根据模板更新，全字段更新
     *
     * @param example
     * @return
     */
    int updateByExample(T t, Example example);

    /**
     * 根据模板更新选定子段
     *
     * @param t
     * @param example
     * @return
     */
    int updateByExampleSelective(T t, Example example);

    /**
     * 根据主键更新,将设置的属性进行更新，如果不设置属性，自动更新为null。
     *
     * @param t
     * @return
     */
    int updateByPrimaryKey(T t);

    /**
     * 根据主键更新,将设置的属性进行更新，没有设置的属性不更新。推荐
     *
     * @param t
     * @return
     */
    int updateByPrimaryKeySelective(T t);

}
